iT邦幫忙

DAY 11
0

Sharping up with UnderScore.js library系列 第 12

Underscore [11] : 使用 difference 情境

  • 分享至 

  • xImage
  •  

今天來介紹 Underscore 的 difference 語法 , 其語法如下 :

_.difference([1, 2, 3, 4, 5], [5, 2, 10]);

結果 :

=> [1, 3, 4]

以上面的範例來說 , 其結果會返回 A 陣列中不存在於 B 陣列元素的集合

這方法其實相當好用 , 可是它只適用於基本資料型態 ,

若今天我們要應付比較複雜的物件呢 ?

我們新增了兩組集合 , 兩個集合不同的地方在於第一個集合 ( fundGroup1 ) 多了一個元素 基金2

當我使用 difference 語法來應付這種結構呢 , 如附圖 :

其顯示的結果不是我們要的 , 這就是我前面所說它只能應付基本型態 ,

由於 difference 內部的實做是使用 _contains , 而 _contains 的實做

是使用了 indexOf 來做搜尋的動作 , 因此才無法達到比對物件的效果 ,

那我們來改用另外一種方式吧 ,

我們使用 map 語法取得具有唯一性的 FUND_CODE , 如下 :

var t1 = _.map(fundGroup1,function(item){ return item.FUND_CODE})


var t2 = _.map(fundGroup2,function(item){ return item.FUND_CODE})

其結果如下圖 :

這樣我們就可以繼續使用 difference 來幫我們嚕 , 如下圖 :

我們得到正確的結果嚕 ~

接下來藉著 CODE3 回頭去抓 fundGroup 裡面的 CODE3 基金物件 ,

  1. 先宣告一個 resultGroup 變數來儲存結果
  2. 迴圈 diff 陣列取出每一個基金 FUND_CODE
  3. 使用 _.find 比對 fundsGroup1 每個物件的 FUND_CODE
  4. 存入 resultGroup

上述的迂迴的方式的確很麻煩 , 所以你也可以參考下列的方式 ..

_.filter(fundGroup1, function(obj){ return !_.findWhere(fundGroup2, obj); });

其結果如下圖 , 一樣的結果 , 只是在這裡需要使用到 findWhere 語法 ,

有興趣的人可以參考下列的文章 :

using underscore's “difference” method on objects

2014 / 10 / 31 修正

本文同步發布於 保政島 Underscore 使用 difference 情境


上一篇
Underscore [10] : 使用 pluck 情境
下一篇
Underscore [12] : 使用 max 情境
系列文
Sharping up with UnderScore.js library31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言